package br.com.fatecjp.pooai.gerenciador.taxi.agent;

import jade.core.Agent;
import jade.domain.DFService;
import jade.domain.FIPAException;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.lang.acl.ACLMessage;
import br.com.fatecjp.pooai.gerenciador.taxi.ambiente.Posicao;
import br.com.fatecjp.pooai.gerenciador.taxi.behaviour.RegistrarTaxiBehaviour;
import br.com.fatecjp.pooai.gerenciador.taxi.message.ConteudoMensagemAgente;
import br.com.fatecjp.pooai.gerenciador.taxi.message.TipoMensagemAgente;
import br.com.fatecjp.pooai.gerenciador.taxi.message.parser.ConteudoMensagemAgenteParser;
import br.com.fatecjp.pooai.gerenciador.taxi.service.NomeServico;

public class AgenteTaxi extends Agent {

	private static final long serialVersionUID = -4796471746132616420L;

	private ConteudoMensagemAgenteParser mensagemAgenteParser;

	private Posicao posicaoAtual;

	private Posicao posicaoCliente;
	private Posicao posicaoDestino;

	private String identCliente;

	protected void setup() {

		this.mensagemAgenteParser = new ConteudoMensagemAgenteParser();
		this.addBehaviour(new RegistrarTaxiBehaviour(this));

	}

	public void setPosicaoAtual(Posicao posicaoAtual) {
		this.posicaoAtual = posicaoAtual;
	}

	public Posicao getPosicaoAtual() {
		return this.posicaoAtual;
	}

	public void setPosicaoCliente(Posicao posicaoCliente) {
		this.posicaoCliente = posicaoCliente;
	}

	public Posicao getPosicaoCliente() {
		return this.posicaoCliente;
	}

	public void setPosicaoDestino(Posicao posicaoDestino) {
		this.posicaoDestino = posicaoDestino;
	}

	public Posicao getPosicaoDestino() {
		return this.posicaoDestino;
	}

	public Boolean possuiCliente() {
		return this.identCliente != null;
	}

	public void setIdentCliente(String identCliente) {
		this.identCliente = identCliente;
	}

	public String getIdentCliente() {
		return this.identCliente;
	}

	public void doDelete() {
		this.desregistrar();
		super.doDelete();
	}

	private void desregistrar() {

		ServiceDescription descricaoServico = new ServiceDescription();
		descricaoServico.setName(NomeServico.DESREGISTRO_TAXI.toString());

		DFAgentDescription descricaoAgente = new DFAgentDescription();
		descricaoAgente.addServices(descricaoServico);

		DFAgentDescription[] agentesEncontrados = null;
		try {
			agentesEncontrados = DFService.search(this, descricaoAgente);
		} catch (FIPAException e) {
			throw new RuntimeException(e);
		}

		if (agentesEncontrados != null && agentesEncontrados.length > 0) {

			descricaoAgente = agentesEncontrados[0];

			ACLMessage requisicaoDesregistro = new ACLMessage(
					ACLMessage.REQUEST);
			requisicaoDesregistro.setSender(this.getAID());
			requisicaoDesregistro.addReceiver(descricaoAgente.getName());

			ConteudoMensagemAgente conteudoMensagem = new ConteudoMensagemAgente(
					TipoMensagemAgente.DESREGISTRO_TAXI.getCode());
			requisicaoDesregistro.setContent(mensagemAgenteParser
					.toString(conteudoMensagem));

			this.send(requisicaoDesregistro);

			boolean desregistrado = false;

			while (!desregistrado) {

				ACLMessage resposta = this.blockingReceive(5000L);
				if (resposta != null
						&& resposta.getPerformative() == ACLMessage.CONFIRM) {
					desregistrado = true;
				}

			}

		}

	}

}
